import json
import math

def dms_to_deg(dms_str):
    """
    将度分秒格式的字符串转换为十进制度数。

    参数:
    dms_str (str): 度分秒格式的字符串

    返回:
    float: 转换后的十进制度数
    """
    dms = dms_str.strip()
    d = int(dms[:-4])
    m = int(dms[-4:-2])
    s = int(dms[-2:])
    return d + m / 60 + s / 3600

def haversine(lon1, lat1, lon2, lat2):
    """
    计算两个经纬度点之间的球面距离（单位：千米）。

    参数:
    lon1 (float): 第一个点的经度
    lat1 (float): 第一个点的纬度
    lon2 (float): 第二个点的经度
    lat2 (float): 第二个点的纬度

    返回:
    float: 两点之间的球面距离
    """
    # 将角度转换为弧度
    lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2])

    # 应用 Haversine 公式
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = math.sin(dlat / 2) ** 2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
    c = 2 * math.asin(math.sqrt(a))
    r = 6371  # 地球半径，单位：千米
    return c * r

def find_nearby_stations(file_path, target_station_id, max_distance):
    """
    查找指定站点周边一定距离范围内的站点，同时包含目标站点。

    参数:
    file_path (str): 包含站点信息的 JSON 文件路径
    target_station_id (str): 目标站点的 Station_Id_C
    max_distance (float): 最大距离（单位：千米）

    返回:
    list: 包含目标站点和符合条件的周边站点列表
    """
    with open(file_path, 'r', encoding='utf-8') as f:
        stations = json.load(f)

    target_station = None
    for station in stations:
        if station["Station_Id_C"] == target_station_id:
            target_lon = dms_to_deg(station["Lon"])
            target_lat = dms_to_deg(station["Lat"])
            target_station = station
            break

    if not target_station:
        print(f"未找到 Station_Id_C 为 {target_station_id} 的站点。")
        return []

    nearby_stations = [target_station]  # 先将目标站点添加到列表
    for station in stations:
        if station["Station_Id_C"] != target_station_id:
            lon = dms_to_deg(station["Lon"])
            lat = dms_to_deg(station["Lat"])
            distance = haversine(target_lon, target_lat, lon, lat)
            if distance <= max_distance:
                nearby_stations.append(station)

    return nearby_stations

if __name__ == "__main__":
    input_file = "2024071613.json"
    output_file = "20km.json"
    target_station_id = "V7036"
    max_distance = 20  # 单位：千米

    nearby_stations = find_nearby_stations(input_file, target_station_id, max_distance)

    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(nearby_stations, f, ensure_ascii=False, indent=4)

    print(f"已找到 {len(nearby_stations)} 个站点，结果已保存到 {output_file}。")
